JavaScriptã®éåæãžã§ãã¬ãŒã¿ãŒã®åãè§£ãæŸã¡ãå¹ççãªããŒã¿ã¹ããªãŒãã³ã°ãå®çŸããŸããéåæããã°ã©ãã³ã°ãç°¡çŽ åããå€§èŠæš¡ãªããŒã¿ã»ãããåŠçããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžãããæ¹æ³ãæ¢ããŸãã
JavaScriptã®éåæãžã§ãã¬ãŒã¿ãŒïŒããŒã¿ã¹ããªãŒãã³ã°ã«é©åœããããã
é²åãç¶ããWebéçºã®äžçã«ãããŠãéåææäœãå¹ççã«åŠçããããšã¯æãéèŠã§ããJavaScriptã®éåæãžã§ãã¬ãŒã¿ãŒã¯ãããŒã¿ã®ã¹ããªãŒãã³ã°ãå€§èŠæš¡ãªããŒã¿ã»ããã®åŠçããããŠå¿çæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã®ããã®åŒ·åã§ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãéåæãžã§ãã¬ãŒã¿ãŒã®æŠå¿µãå©ç¹ããããŠå®çšçãªå¿çšäŸãæ¢ãããã®éèŠãªæè¡ãç¿åŸããããã®åãäžããŸãã
JavaScriptã«ãããéåææäœã®çè§£
åŸæ¥ã®JavaScriptã³ãŒãã¯åæçã«å®è¡ãããŸããã€ãŸããåæäœãå®äºããŠããæ¬¡ã®æäœãå§ãŸããŸããããããå€ãã®çŸå®äžçã®ã·ããªãªã§ã¯ãAPIããã®ããŒã¿ååŸããã¡ã€ã«ã®èªã¿åãããŠãŒã¶ãŒå ¥åã®åŠçãªã©ãéåææäœãé¢ãã£ãŠããŸãããããã®æäœã«ã¯æéããããå¯èœæ§ããããã¡ã€ã³ã¹ã¬ããããããã¯ããŠãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœäžãããåå ãšãªãåŸãŸããéåæããã°ã©ãã³ã°ã䜿çšãããšãä»ã®ã³ãŒãã®å®è¡ããããã¯ããããšãªãæäœãéå§ã§ããŸããã³ãŒã«ããã¯ãPromiseããããŠAsync/Awaitã¯ãéåæã¿ã¹ã¯ã管çããããã®äžè¬çãªææ³ã§ãã
JavaScriptéåæãžã§ãã¬ãŒã¿ãŒã®ç޹ä»
éåæãžã§ãã¬ãŒã¿ãŒã¯ãéåææäœã®èœåãšãžã§ãã¬ãŒã¿ãŒã®å埩èœåãçµã¿åãããç¹æ®ãªé¢æ°ã§ããããã«ãããå€ã®ã·ãŒã±ã³ã¹ãéåæã«ãäžåºŠã«äžã€ãã€çæããããšãã§ããŸãããªã¢ãŒããµãŒããŒããããŒã¿ããã£ã³ã¯åäœã§ååŸããããšãæ³åããŠã¿ãŠãã ãããããŒã¿ã»ããå šäœãåŸ ã€ä»£ããã«ãåãã£ã³ã¯ãå°çãããã³ã«åŠçã§ããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã®äž»ãªç¹åŸŽïŒ
- éåæïŒ
async
ããŒã¯ãŒãã䜿çšããawait
ã䜿ã£ãŠéåææäœãå®è¡ã§ããŸãã - ãžã§ãã¬ãŒã¿ãŒïŒ
yield
ããŒã¯ãŒãã䜿çšããŠå®è¡ãäžæåæ¢ããå€ãè¿ããŸããæ¬¡ã®å€ãèŠæ±ããããšãäžæãããšããããåéããŸãã - éåæã€ãã¬ãŒã¿ãŒïŒéåæã€ãã¬ãŒã¿ãŒãè¿ããŸããããã¯
for await...of
ã«ãŒãã䜿çšããŠæ¶è²»ã§ããŸãã
æ§æãšäœ¿çšæ³
éåæãžã§ãã¬ãŒã¿ãŒã®æ§æãèŠãŠã¿ãŸãããïŒ
async function* asyncGeneratorFunction() {
// Asynchronous operations
yield value1;
yield value2;
// ...
}
// Consuming the Async Generator
async function consumeGenerator() {
for await (const value of asyncGeneratorFunction()) {
console.log(value);
}
}
consumeGenerator();
説æïŒ
async function*
æ§æã¯ãéåæãžã§ãã¬ãŒã¿ãŒé¢æ°ãå®çŸ©ããŸããyield
ããŒã¯ãŒãã¯é¢æ°ã®å®è¡ãäžæåæ¢ããå€ãè¿ããŸããfor await...of
ã«ãŒãã¯ãéåæãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠçæãããå€ãå埩åŠçããŸããawait
ããŒã¯ãŒãã¯ãåå€ãåŠçãããåã«å®å šã«è§£æ±ºãããããšãä¿èšŒããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã䜿çšããå©ç¹
éåæãžã§ãã¬ãŒã¿ãŒã¯ãéåæããŒã¿ã¹ããªãŒã ãåŠçããäžã§æ°å€ãã®å©ç¹ãæäŸããŸãïŒ
- ããã©ãŒãã³ã¹ã®åäžïŒããŒã¿ããã£ã³ã¯ã§åŠçããããšã«ãããéåæãžã§ãã¬ãŒã¿ãŒã¯ã¡ã¢ãªæ¶è²»ãåæžããç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããæ±ãå Žåã«ã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžãããŸãã
- ã³ãŒãã®å¯èªæ§ã®åäžïŒéåæã³ãŒããç°¡çŽ åããçè§£ãšä¿å®ã容æã«ããŸãã
for await...of
ã«ãŒãã¯ãéåæããŒã¿ã¹ããªãŒã ãæ¶è²»ããããã®ã¯ãªãŒã³ã§çŽæçãªæ¹æ³ãæäŸããŸãã - ç°¡çŽ åããããšã©ãŒåŠçïŒéåæãžã§ãã¬ãŒã¿ãŒã䜿çšãããšããžã§ãã¬ãŒã¿ãŒé¢æ°å ã§ãšã©ãŒãé©åã«åŠçã§ããã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã«ãšã©ãŒãäŒæããã®ãé²ããŸãã
- ããã¯ãã¬ãã·ã£ãŒç®¡çïŒããŒã¿ã®çæãšæ¶è²»ã®é床ãå¶åŸ¡ã§ãããããã³ã³ã·ã¥ãŒããŒãé«éãªããŒã¿ã¹ããªãŒã ã«å§åãããã®ãé²ããŸããããã¯ããããã¯ãŒã¯æ¥ç¶ã垯åå¹ ãéãããããŒã¿ãœãŒã¹ãå«ãã·ããªãªã§ç¹ã«éèŠã§ãã
- é å»¶è©äŸ¡ïŒéåæãžã§ãã¬ãŒã¿ãŒã¯ãèŠæ±ããããšãã«ã®ã¿å€ãçæãããããããŒã¿ã»ããå šäœãåŠçããå¿ èŠããªãå Žåã«åŠçæéãšãªãœãŒã¹ãç¯çŽã§ããŸãã
å®è·µçãªäŸ
éåæãžã§ãã¬ãŒã¿ãŒãã©ã®ããã«äœ¿çšã§ããããããã€ãã®å®äžçã®äŸãèŠãŠã¿ãŸãããïŒ
1. APIããã®ããŒã¿ã¹ããªãŒãã³ã°
ããŒãžåå²ãããAPIããããŒã¿ãååŸããããšãèããŠã¿ãŸãããããã¹ãŠã®ããŒãžãããŠã³ããŒããããã®ãåŸ ã€ä»£ããã«ãéåæãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãå©çšå¯èœã«ãªã£ãåããŒãžãã¹ããªãŒãã³ã°ã§ããŸãïŒ
async function* fetchPaginatedData(url) {
let page = 1;
while (true) {
const response = await fetch(`${url}?page=${page}`);
const data = await response.json();
if (data.length === 0) {
return; // No more data
}
for (const item of data) {
yield item;
}
page++;
}
}
async function processData() {
for await (const item of fetchPaginatedData('https://api.example.com/data')) {
console.log(item);
// Process each item here
}
}
processData();
ãã®äŸã§ã¯ãããŒãžåå²ãããAPIããããŒã¿ãååŸããããŒã¿ã»ããå šäœã®ããŠã³ããŒããåŸ ããã«ãåé ç®ãå°çãããã³ã«åŠçããæ¹æ³ã瀺ããŠããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®äœæããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
2. 倧ããªãã¡ã€ã«ããã£ã³ã¯ã§èªã¿åã
倧ããªãã¡ã€ã«ãæ±ãå Žåããã¡ã€ã«å šäœãã¡ã¢ãªã«èªã¿èŸŒãã®ã¯éå¹ççã§ããéåæãžã§ãã¬ãŒã¿ãŒã䜿çšãããšããã¡ã€ã«ãããå°ããªãã£ã³ã¯ã§èªã¿åããèªã¿åãããåãã£ã³ã¯ãåŠçã§ããŸãïŒ
const fs = require('fs');
const readline = require('readline');
async function* readLargeFile(filePath) {
const fileStream = fs.createReadStream(filePath);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity, // Recognize all instances of CR LF
});
for await (const line of rl) {
yield line;
}
}
async function processFile() {
for await (const line of readLargeFile('path/to/large/file.txt')) {
console.log(line);
// Process each line here
}
}
processFile();
ãã®äŸã§ã¯ãfs
ã¢ãžã¥ãŒã«ã䜿çšããŠèªã¿åãã¹ããªãŒã ãäœæããreadline
ã¢ãžã¥ãŒã«ã䜿çšããŠãã¡ã€ã«ãäžè¡ãã€èªã¿åããŸããåè¡ã¯éåæãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠyieldããããã¡ã€ã«ã管çå¯èœãªãã£ã³ã¯ã§åŠçããããšãã§ããŸãã
3. ããã¯ãã¬ãã·ã£ãŒã®å®è£
ããã¯ãã¬ãã·ã£ãŒã¯ãããŒã¿ã®çæãšæ¶è²»ã®é床ãå¶åŸ¡ããã¡ã«ããºã ã§ããããã¯ããããã¥ãŒãµãŒãã³ã³ã·ã¥ãŒããŒãåŠçã§ãããããéãããŒã¿ãçæããŠããå Žåã«éåžžã«éèŠã§ããéåæãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãã³ã³ã·ã¥ãŒããŒãããå€ãã®ããŒã¿ãåãå ¥ããæºåãã§ãããŸã§ãžã§ãã¬ãŒã¿ãŒãäžæåæ¢ããããšã§ãããã¯ãã¬ãã·ã£ãŒãå®è£ ã§ããŸãïŒ
async function* generateData() {
for (let i = 0; i < 100; i++) {
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate some work
yield i;
}
}
async function processData() {
for await (const item of generateData()) {
console.log(`Processing: ${item}`);
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate slow processing
}
}
processData();
ãã®äŸã§ã¯ãgenerateData
颿°ã¯100ããªç§ããšã«ããŒã¿ãçæããããŒã¿ãœãŒã¹ãã·ãã¥ã¬ãŒãããŸããprocessData
颿°ã¯ãåé
ç®ã®åŠçã«500ããªç§ãããã³ã³ã·ã¥ãŒããŒãã·ãã¥ã¬ãŒãããŸããprocessData
颿°å
ã®await
ããŒã¯ãŒãã广çã«ããã¯ãã¬ãã·ã£ãŒãå®è£
ãããžã§ãã¬ãŒã¿ãŒãã³ã³ã·ã¥ãŒããŒãåŠçã§ãããããéãããŒã¿ãçæããã®ãé²ããŸãã
æ¥çãè¶ ãããŠãŒã¹ã±ãŒã¹
éåæãžã§ãã¬ãŒã¿ãŒã¯ãããŸããŸãªæ¥çã§å¹ åºãå¿çšãããŠããŸãïŒ
- Eã³ããŒã¹ïŒååã«ã¿ãã°ã®ã¹ããªãŒãã³ã°ããªã¢ã«ã¿ã€ã ã§ã®æ³šæåŠçãããããã®ããŒãœãã©ã€ãºããŠãŒã¶ãŒãé²èЧããŠããéã«ååã®ãããããã¹ããªãŒãã³ã°ãããã·ããªãªãæ³åããŠã¿ãŠãã ããããã¹ãŠã®ãããããäºåã«èšç®ãããã®ãåŸ ã€å¿ èŠã¯ãããŸããã
- éèïŒéèããŒã¿ã¹ããªãŒã ã®åæãåžå Žååã®ç£èŠãååŒã®å®è¡ãäŸãã°ããªã¢ã«ã¿ã€ã ã®æ ªäŸ¡ãã¹ããªãŒãã³ã°ããç§»åå¹³åããã®å Žã§èšç®ããŸãã
- ãã«ã¹ã±ã¢ïŒå»çã»ã³ãµãŒããŒã¿ã®åŠçãæ£è ã®å¥åº·ç¶æ ã®ç£èŠãé éå»çã®æäŸããŠã§ã¢ã©ãã«ããã€ã¹ãæ£è ã®ãã€ã¿ã«ãµã€ã³ãå»åž«ã®ããã·ã¥ããŒãã«ãªã¢ã«ã¿ã€ã ã§ã¹ããªãŒãã³ã°ããã®ãèããŠã¿ãŠãã ããã
- IoTïŒã¢ãã®ã€ã³ã¿ãŒãããïŒïŒã»ã³ãµãŒããã®ããŒã¿ã®åéãšåŠçãããã€ã¹ã®å¶åŸ¡ãã¹ããŒãç°å¢ã®æ§ç¯ãäŸãã°ãã¹ããŒããã«ãã£ã³ã°å ã®äœåãã®ã»ã³ãµãŒããã®æž©åºŠæž¬å®å€ãéçŽããŸãã
- ã¡ãã£ã¢ïŒãšã³ã¿ãŒãã€ã¡ã³ãïŒãããªããã³ãªãŒãã£ãªã³ã³ãã³ãã®ã¹ããªãŒãã³ã°ãã€ã³ã¿ã©ã¯ãã£ããªäœéšã®æäŸãã³ã³ãã³ãã®ããããã®ããŒãœãã©ã€ãºãäŸãšããŠããŠãŒã¶ãŒã®ãããã¯ãŒã¯æ¥ç¶ã«åºã¥ããŠãããªå質ãåçã«èª¿æŽããããšãæããããŸãã
ãã¹ããã©ã¯ãã£ã¹ãšèæ ®äºé
éåæãžã§ãã¬ãŒã¿ãŒã广çã«äœ¿çšããã«ã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- ãšã©ãŒåŠçïŒéåæãžã§ãã¬ãŒã¿ãŒå
ã«å
ç¢ãªãšã©ãŒåŠçãå®è£
ããŠããšã©ãŒãã³ã³ã·ã¥ãŒããŒã«äŒæããã®ãé²ããŸããäŸå€ããã£ããããŠåŠçããã«ã¯
try...catch
ãããã¯ã䜿çšããŸãã - ãªãœãŒã¹ç®¡çïŒãã¡ã€ã«ãã³ãã«ããããã¯ãŒã¯æ¥ç¶ãªã©ã®ãªãœãŒã¹ãéåæãžã§ãã¬ãŒã¿ãŒå ã§é©åã«ç®¡çããŸããäžèŠã«ãªã£ããªãœãŒã¹ãéãããããè§£æŸãããããã«ããŸãã
- ããã¯ãã¬ãã·ã£ãŒïŒã³ã³ã·ã¥ãŒããŒãé«éãªããŒã¿ã¹ããªãŒã ã«å§åãããã®ãé²ãããã«ãããã¯ãã¬ãã·ã£ãŒãå®è£ ããŸãã
- ãã¹ãïŒéåæãžã§ãã¬ãŒã¿ãŒã培åºçã«ãã¹ãããŠãæ£ããå€ãçæãããšã©ãŒãæ£ããåŠçããŠããããšã確èªããŸãã
- ãã£ã³ã»ã«ïŒã³ã³ã·ã¥ãŒããŒãããŒã¿ãå¿ èŠãšããªããªã£ãå Žåã«éåæãžã§ãã¬ãŒã¿ãŒããã£ã³ã»ã«ããã¡ã«ããºã ãæäŸããŸããããã¯ããžã§ãã¬ãŒã¿ãŒã宿çã«ãã§ãã¯ããã·ã°ãã«ããã©ã°ã䜿çšããŠå®çŸã§ããŸãã
- éåæå埩ãããã³ã«ïŒéåæãžã§ãã¬ãŒã¿ãŒãšéåæã€ãã¬ãŒã¿ãŒãå éšã§ã©ã®ããã«æ©èœããããçè§£ããããã«ãéåæå埩ãããã³ã«ã«ç²ŸéããŠãã ããã
éåæãžã§ãã¬ãŒã¿ãŒ vs. åŸæ¥ã®ã¢ãããŒã
PromiseãAsync/Awaitãªã©ã®ä»ã®ã¢ãããŒãã§ãéåææäœãåŠçã§ããŸãããéåæãžã§ãã¬ãŒã¿ãŒã¯ããŒã¿ã®ã¹ããªãŒãã³ã°ã«ãããŠç¬èªã®å©ç¹ãæäŸããŸãïŒ
- ã¡ã¢ãªå¹çïŒéåæãžã§ãã¬ãŒã¿ãŒã¯ããŒã¿ããã£ã³ã¯ã§åŠçãããããããŒã¿ã»ããå šäœãã¡ã¢ãªã«ããŒãããå Žåãšæ¯èŒããŠã¡ã¢ãªæ¶è²»ãåæžããŸãã
- å¿çæ§ã®åäžïŒããŒã¿ãå°çãããã³ã«åŠçã§ãããããããå¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŸãã
- ç°¡çŽ åãããã³ãŒãïŒ
for await...of
ã«ãŒãã¯ãéåæããŒã¿ã¹ããªãŒã ãæ¶è²»ããããã®ã¯ãªãŒã³ã§çŽæçãªæ¹æ³ãæäŸããéåæã³ãŒããç°¡çŽ åããŸãã
ãã ããéåæãžã§ãã¬ãŒã¿ãŒãåžžã«æè¯ã®ãœãªã¥ãŒã·ã§ã³ã§ãããšã¯éããªãããšã«æ³šæããããšãéèŠã§ããããŒã¿ã®ã¹ããªãŒãã³ã°ã䌎ããªãåçŽãªéåææäœã«ã¯ãPromiseãAsync/Awaitã®æ¹ãé©ããŠããå ŽåããããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã®ãããã°
éåæãžã§ãã¬ãŒã¿ãŒã¯ããã®éåæçãªæ§è³ªã®ããã«ãããã°ãå°é£ãªå ŽåããããŸããéåæãžã§ãã¬ãŒã¿ãŒã广çã«ãããã°ããããã®ãã³ããããã€ã玹ä»ããŸãïŒ
- ãããã¬ãŒã®äœ¿çšïŒãã©ãŠã¶ã®éçºè ããŒã«ã«çµã¿èŸŒãŸããŠãããã®ãªã©ãJavaScriptãããã¬ãŒã䜿çšããŠã³ãŒããã¹ãããå®è¡ãã倿°ãæ€æ»ããŸãã
- ãã®ã³ã°ïŒéåæãžã§ãã¬ãŒã¿ãŒã«ãã°ã¹ããŒãã¡ã³ãã远å ããŠãå®è¡ãããŒãšçæãããå€ã远跡ããŸãã
- ãã¬ãŒã¯ãã€ã³ãïŒéåæãžã§ãã¬ãŒã¿ãŒå ã«ãã¬ãŒã¯ãã€ã³ããèšå®ããŠå®è¡ãäžæåæ¢ãããžã§ãã¬ãŒã¿ãŒã®ç¶æ ãæ€æ»ããŸãã
- Async/Awaitãããã°ããŒã«ïŒéåæã³ãŒãçšã«èšèšãããå°éã®ãããã°ããŒã«ãå©çšããŸããããã«ãããPromiseãAsync/Await颿°ã®å®è¡ãããŒãèŠèŠåã§ããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã®æªæ¥
éåæãžã§ãã¬ãŒã¿ãŒã¯ãJavaScriptã§éåæããŒã¿ã¹ããªãŒã ãåŠçããããã®åŒ·åã§å€æ©èœãªããŒã«ã§ããéåæããã°ã©ãã³ã°ã¯é²åãç¶ããŠãããéåæãžã§ãã¬ãŒã¿ãŒã¯é«æ§èœã§å¿çæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§ãŸããŸãéèŠãªåœ¹å²ãæãããšæåŸ ãããŠããŸããJavaScriptããã³é¢é£æè¡ã®ç¶ç¶çãªéçºã«ãããéåæãžã§ãã¬ãŒã¿ãŒã«ã¯ãããªãæ©èœåŒ·åãšæé©åãããããããããã«åŒ·åã§äœ¿ãããããªãã§ãããã
çµè«
JavaScriptã®éåæãžã§ãã¬ãŒã¿ãŒã¯ãããŒã¿ã®ã¹ããªãŒãã³ã°ãå€§èŠæš¡ãªããŒã¿ã»ããã®åŠçããããŠå¿çæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã®ããã®åŒ·åã§ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŸããéåæãžã§ãã¬ãŒã¿ãŒã®æŠå¿µãå©ç¹ããããŠå®çšçãªå¿çšäŸãçè§£ããããšã§ãéåæããã°ã©ãã³ã°ã®ã¹ãã«ãå€§å¹ ã«åäžãããããå¹ççã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããAPIããã®ããŒã¿ã¹ããªãŒãã³ã°ãã倧ããªãã¡ã€ã«ã®åŠçãŸã§ãéåæãžã§ãã¬ãŒã¿ãŒã¯è€éãªéåæã®èª²é¡ã«åãçµãããã®å€æ©èœãªããŒã«ã»ãããæäŸããŸããéåæãžã§ãã¬ãŒã¿ãŒã®åãæŽ»çšããJavaScriptã¢ããªã±ãŒã·ã§ã³ã§æ°ããã¬ãã«ã®å¹çãšå¿çæ§ãè§£ãæŸã¡ãŸãããã